package com.itheima.proxy.cglib;

import org.springframework.cglib.core.DebuggingClassWriter;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author by itheima
 * @Date 2021/11/21
 * @Description
 */
public class CglibProxy {
    public static void main(String[] args) {
        //输出动态生成的代理对象字节码文件
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "C:\\Users\\46035\\Desktop\\proxy");
//        定义目标对象
        Honda target = new Honda();

        //1.为Honda生成代理对象，这个类没有实现任何接口
        /*
            参数1：目标对象类型
            参数2：方法增强对象（方法拦截对象）
         */
        Honda hodaProxy = (Honda) Enhancer.create(Honda.class, new MethodInterceptor() {
            /**
             * @param proxy 代理对象的引用
             * @param method 被拦截的方法的对象
             * @param args 方法的入参
             * @param methodProxy 代理方法的引用（对增强方法的包装）
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                //打印开始时间
                long startTime = System.currentTimeMillis();
                System.out.println("开始时间："+startTime);
                //原始方法执行
                Object result = method.invoke(target, args);
                long endTime = System.currentTimeMillis();
                System.out.println("结束时间："+endTime);
                return result;
            }
        });
        hodaProxy.run();
    }
}
